package experiment.e04.code;

/**
 * @author thinkpad - 83start
 * @version v1.0
 * @create 2022/9/29 16:50
 * @package experiment.e04.code
 * @description
 * 3. 设计一个动物声音“模拟器”，希望模拟器可以模拟许多动物的叫声，要求如下：
 * （1）编写抽象类Animal（）
 * 该类有两个抽象方法cry()和getAnimalName()，即要求各种具体的动物给出自己的叫声和种类名称。
 * （2）编写模拟器类Simulator
 * 该类有一个playSound(Animal animal)方法，该方法的参数是Animal类型。即参数animal可以调用Animal的子类重写cry()方法播放具体动物的声音，调用子类重写getAnimalName()方法显示动物种类的名称。
 * （3）编写Animal类的子类：Dog和Cat类
 * （4）编写主类Application（用户程序）
 * 在主类Application的main方法中至少包含如下代码：
 *        Simulator simulator=new Simulator();
 *        simulator.playSound(new Dog());
 * simulator.playSound(new Cat ());
 * 参考代码如下：
 * (1) Animal.java
 * public abstract class Animal {
 *     public abstract void cry();
 *     public abstract String getAnimalName();
 * }
 * (2) Simulator.java
 * public class Simulator {
 *    public void playSound(Animal animal) {
 *        System.out.print("现在播放"+animal.getAnimalName()+"类的声音:");
 *        animal.cry();
 *    }
 * }
 *
 * (3) Dog.java
 * public class Dog extends Animal {
 *   //重写方法cry()和getAnimalName()，输出狗的叫声“汪汪…汪汪”和狗的name“狗”。
 *    ……
 * }
 * Cat.java
 * public class Cat extends Animal {
 *   //重写方法cry()和getAnimalName()，输出猫的叫声“喵喵...喵喵”和猫的name“猫”。
 *   ……
 * }
 * (4) Application.java
 * public class Application{
 *    public static void main(String args[]) {
 *       Simulator simulator = new Simulator();
 *       simulator.playSound(new Dog());
 *       simulator.playSound(new Cat());
 *    }
 * }
 */

public class E03 {

    // 测试主函数
    public static void main(String[] args) {
        Simulator1 simulator = new Simulator1();
        simulator.playSound(new Dog1());
        simulator.playSound(new Cat1());
    }
}

/**
 * 动物类
 */
abstract class Animal1 {
    public abstract void cry();

    public abstract String getAnimalName();
}

/**
 * 模拟器类
 */
class Simulator1 {
    public void playSound(Animal1 animal){
        System.out.print("现在播放" + animal.getAnimalName() + "类的声音\t");
        animal.cry();
    }
}

/**
 * 狗类
 */
class Dog1 extends Animal1 {

    @Override
    public void cry() {
        System.out.println("汪汪汪");
    }

    @Override
    public String getAnimalName() {
        return "狗🐕";
    }
}

/**
 * 猫类
 */
class Cat1 extends Animal1 {

    @Override
    public void cry() {
        System.out.println("喵喵喵");
    }

    @Override
    public String getAnimalName() {
        return "猫🐱";
    }
}